Comparing files glidexp_build1014_src\glide3x\h5\minihwc\fxhwc.h and glidexp_build1015_src\glide3x\h5\minihwc\fxhwc.h
FC: no differences encountered

Comparing files glidexp_build1014_src\glide3x\h5\minihwc\initvga.h and glidexp_build1015_src\glide3x\h5\minihwc\initvga.h
FC: no differences encountered

Comparing files glidexp_build1014_src\glide3x\h5\minihwc\lindri.h and glidexp_build1015_src\glide3x\h5\minihwc\lindri.h
FC: no differences encountered

Comparing files glidexp_build1014_src\glide3x\h5\minihwc\qmodes.h and glidexp_build1015_src\glide3x\h5\minihwc\qmodes.h
FC: no differences encountered

Comparing files glidexp_build1014_src\glide3x\h5\minihwc\setmode.h and glidexp_build1015_src\glide3x\h5\minihwc\setmode.h
FC: no differences encountered

Comparing files glidexp_build1014_src\glide3x\h5\minihwc\tv.h and glidexp_build1015_src\glide3x\h5\minihwc\tv.h
FC: no differences encountered

Comparing files glidexp_build1014_src\glide3x\h5\minihwc\hwcext.h and glidexp_build1015_src\glide3x\h5\minihwc\hwcext.h
FC: no differences encountered

Comparing files glidexp_build1014_src\glide3x\h5\minihwc\Hwcio.h and glidexp_build1015_src\glide3x\h5\minihwc\Hwcio.h
FC: no differences encountered

Comparing files glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.h and glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.h
****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.h
#include <fxvid.h>

****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.h
#include <fxvid.h>
#include <cpuid.h>

******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.h
  FxI16 hwcEscape ; /* AJB- sucky: H5 TOT uses a diff't escape code than H3 */
} hwcBoardInfo;
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.h
  FxI16 hwcEscape ; /* AJB- sucky: H5 TOT uses a diff't escape code than H3 */
  /* CPU info */
  _p_info CPUInfo;
} hwcBoardInfo;
******


Comparing files glidexp_build1014_src\glide3x\h5\minihwc\dos_mode.c and glidexp_build1015_src\glide3x\h5\minihwc\dos_mode.c
FC: no differences encountered

Comparing files glidexp_build1014_src\glide3x\h5\minihwc\hwcio.c and glidexp_build1015_src\glide3x\h5\minihwc\hwcio.c
FC: no differences encountered

Comparing files glidexp_build1014_src\glide3x\h5\minihwc\linhwc.c and glidexp_build1015_src\glide3x\h5\minihwc\linhwc.c
FC: no differences encountered

Comparing files glidexp_build1014_src\glide3x\h5\minihwc\mac_mode.c and glidexp_build1015_src\glide3x\h5\minihwc\mac_mode.c
FC: no differences encountered

Comparing files glidexp_build1014_src\glide3x\h5\minihwc\Dxdrvr.c and glidexp_build1015_src\glide3x\h5\minihwc\Dxdrvr.c
FC: no differences encountered

Comparing files glidexp_build1014_src\glide3x\h5\minihwc\Gdebug.c and glidexp_build1015_src\glide3x\h5\minihwc\Gdebug.c
FC: no differences encountered

Comparing files glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c and glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
#include <windows.h>

****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
#include <windows.h>
#include <mmintrin.h>
#include <malloc.h>

******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
                int monitor;
                
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
                int monitor;
                _p_info CPUInfo;
                
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
                
                hInfo.nBoards = 0;
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
                
                /* Get CPUInfo */
                _cpuid (&CPUInfo);
                {
                        /* No CPU Extensions Allowed */
                        const char *no_cpu_ext = GETENV("GXP_GLIDE_NO_CPU_EXTENSIONS");
                        if (no_cpu_ext && atoi(no_cpu_ext)) CPUInfo.feature = CPUInfo.os_support = 0;
                }

                hInfo.nBoards = 0;
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
                                (void *) hInfo.boardInfo[monitor].hMon);
                }
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
                                (void *) hInfo.boardInfo[monitor].hMon);

                        /* CPUInfo */
                        hInfo.boardInfo[monitor].CPUInfo = CPUInfo;
                }
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
                        }
                        
#ifndef USE_DXOPEN
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
                        }
#define BINFO_VIDINFO_XRES      (bInfo->vidInfo.xRes)
#define BINFO_VIDINFO_YRES      (bInfo->vidInfo.yRes)
#ifndef USE_DXOPEN
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
                        if ( !setVideoMode( (void*)bInfo->vidInfo.hWnd, 
                                bInfo->vidInfo.xRes,
                                bInfo->vidInfo.yRes,
                                bInfo->h3pixelSize,
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
                        if ( !setVideoMode( (void*)bInfo->vidInfo.hWnd, 
                                //bInfo->vidInfo.xRes,
                                //bInfo->vidInfo.yRes,
                                BINFO_VIDINFO_XRES,
                                BINFO_VIDINFO_YRES,
                                bInfo->h3pixelSize,
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
        HWC_IO_STORE(bInfo->regInfo, vidOverlayStartCoords, 0);
        
#endif
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
        HWC_IO_STORE(bInfo->regInfo, vidOverlayStartCoords, 0);

#endif
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
        
        scrWidth = (vidScreenSize >> SST_VIDEO_SCREEN_WIDTH_SHIFT) & 0xfff;
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
        
        //vidScreenSize &= ~(SST_VIDEO_SCREEN_WIDTH|SST_VIDEO_SCREEN_HEIGHT);
        //vidScreenSize |= (BINFO_VIDINFO_XRES << SST_VIDEO_SCREEN_WIDTH_SHIFT) |(BINFO_VIDINFO_YRES << SST_VIDEO_SCREEN_HEIGHT
);
        //HWC_IO_STORE(bInfo->regInfo, vidScreenSize, vidScreenSize);

        scrWidth = (vidScreenSize >> SST_VIDEO_SCREEN_WIDTH_SHIFT) & 0xfff;
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
        vidOverlayDudx = 0UL;
        if (scrWidth > bInfo->vidInfo.xRes) {
                vidProcCfg |= SST_OVERLAY_HORIZ_SCALE_EN;
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
        vidOverlayDudx = 0UL;
        if (scrWidth != bInfo->vidInfo.xRes) {
                vidProcCfg |= SST_OVERLAY_HORIZ_SCALE_EN;
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
        vidOverlayDvdy = 0UL;
        if (scrHeight > bInfo->vidInfo.yRes) {
                vidProcCfg |= SST_OVERLAY_VERT_SCALE_EN;
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
        vidOverlayDvdy = 0UL;
        if (scrHeight != bInfo->vidInfo.yRes) {
                vidProcCfg |= SST_OVERLAY_VERT_SCALE_EN;
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
        }  
        
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
        }  
        vidProcCfg &= ~SST_OVERLAY_FILTER_MODE;
        vidProcCfg |= SST_OVERLAY_FILTER_BILINEAR;
        
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
                        /* 8xaa */
                        ctxReq.optData.sliAAReq.ChipInfo.dwaaSampleHigh     = bInfo->h3pixelSample>>2;
                        
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
                        /* 8xaa */
                        ctxReq.optData.sliAAReq.ChipInfo.dwaaSampleHigh     = bInfo->h3pixelSample>>2?1:0;
                        
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
                        /* 8xaa */
                        Sli_AA_Request.ChipInfo.dwaaSampleHigh     = bInfo->h3pixelSample>>2;
                        
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
                        /* 8xaa */
                        Sli_AA_Request.ChipInfo.dwaaSampleHigh     = bInfo->h3pixelSample>>2?1:0;
                        
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
                HWC_IO_STORE(bInfo->regInfo, vidMaxRGBDelta, bpp == 15 ? 0x101010 : 0x100810);
        }
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
                HWC_IO_STORE(bInfo->regInfo, vidMaxRGBDelta, bpp == 15 ? 0x101010 : 0x100810);

        }
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c

        for(y = 0; y < end_y; y++) {    
                
                if((y & renderMask) == compareMask) {
                        /* This chip owns this scanline. */
                        for(x = 0; x < end_x; x++) {
                                *dst++ += (FxU16) (((*(FxU16*) s) >> 00) & 0x1F) << 3;
                                *dst++ += (FxU16) (((*(FxU16*) s) >> 05) & 0x3F) << 2;
                                *dst++ += (FxU16) (((*(FxU16*) s) >> 11) & 0x1F) << 3;
                                dst++;
                                s+=2;
                        }  
                        s += stride_diff;
                }
                else
                {
                        dst += src_width*4;
                }
        }  
}

****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c

        if (bInfo->CPUInfo.os_support & _CPU_FEATURE_MMX)
        {
                /* MMX Optimized Loop */
                __asm {
                        /* mm7 = zero */
                        pXor            mm7,    mm7;            

                        /* mm6 = mask */
                        push            0x0000F800;             /* a r */
                        push            0x07E0001F;             /* g b */
                        MovQ            mm6,    [esp]
                        Add                     esp,    8

                        /* mm5 = multiplier*/
                        push            0x00010001;             /* a<<=0 r<<=0 */
                        push            0x00200800;             /* g<<=5 b<<=11 */
                        MovQ            mm5,    [esp]
                        Add                     esp,    8

                        /* mm4 = multiplier2*/
                        push            0x00001080;             /* a=00000000 r=10000100 */
                        push            0x10401080;             /* g=10000010 b=10000100 */
                        MovQ            mm4,    [esp]
                        Add                     esp,    8
                }

                for(y = 0; y < end_y; y++)
                {    
                        if((y & renderMask) == compareMask)
                        {
                                /* This chip owns this scanline. */
                                __asm {

                                        /* Scanline Setup */
                                        Mov                     eax,    s
                                        Mov                     edx,    dst
                                        Mov                     edi,    end_x
                                        Shl                     edi,    3
                                        Add                     edi,    edx
                                        Xor                     ebx,    ebx

                                        align 8
loop_begin:
                                        /* Read pixel, and increase to 64 bits */
                                        mov                     bx,             word ptr [eax]  /* ebx has packed rgb */
#if 0
                                        mov                     ecx,    ebx                             /* ecx too */
                                        Shl                     ebx,    3                               /* bl now has b */
                                        Shl                     bh,     2                               /* bh now has g */
                                        Shl                     ecx,    8                               /* shift so r sig bit i
s bit 23 */
                                        And                     ecx,    0xF80000                /* ecx now has r */
                                        Mov                     cx,             bx                              /* ecx now has 
r,g,b */
                                        MovD            mm0,    ecx                             /* Copy RGB into mm0 */
                                        pUnpckLBW       mm0,    mm7                             /* Bytes -> Words */
                                        pSLLQ           mm0,    4                               /* Shift everything left 4 bits
 */
                                        pMulHW          mm0,    mm4                             /* 0000 1080 1040 1080 - Replic
ate high bits to missing low bits */
#else
                                        MovD            mm0,    ebx                             /* Copy RGB into mm0 */
                                        pUnpckLWD       mm0,    mm0                             /* Rep Low Words -> High Words 
*/
                                        pUnpckLDQ       mm0,    mm0                             /* Rep Low Dword -> High Dword 
*/
                                        pAnd            mm0,    mm6                             /* 0000 F800 07E0 001F - Mask c
ols */
                                        pMulLW          mm0,    mm5                             /* 0001 0001 0020 0800 - Shifts
 all cols left */
                                        pSRLQ           mm0,    4                               /* Shift everything back right,
 but only 4 */
                                        pMulHW          mm0,    mm4                             /* 0000 1080 1040 1080 - Replic
ate high bits to missing low bits */
#endif

                                        /* Accumulate */
                                        MovQ            mm3,    mmword ptr [edx]
                                        pAddUSW         mm3,    mm0
                                        MovQ            [edx],  mm3
                                        Add                     eax,    2
                                        Add                     edx,    8

                                        /* Loop */
                                        cmp                     edi,    edx
                                        jne                     loop_begin

                                        /* Next scanline */
                                        add                     eax,    stride_diff
                                        mov                     s,              eax
                                        mov                     dst,    edx
                                };
                        }
                        else
                        {
                                dst += src_width*4;
                        }
                }  

******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c

static void hwcReadRegion1555(hwcBoardInfo *bInfo, FxU32 src, FxU32 src_x, FxU32 src_y, FxU32 src_width, FxU32 src_height, FxU3
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c

                /* Reset MMX State */
                __asm emms;
        }
        else
        {
                /* Standard Unoptimized Loop */
                for(y = 0; y < end_y; y++)
                {    
                        if((y & renderMask) == compareMask)
                        {
                                /* This chip owns this scanline. */
                                for(x = 0; x < end_x; x++) {
                                        *dst++ += (FxU16) (((*(FxU16*) s) >> 00) & 0x1F) << 3;
                                        *dst++ += (FxU16) (((*(FxU16*) s) >> 05) & 0x3F) << 2;
                                        *dst++ += (FxU16) (((*(FxU16*) s) >> 11) & 0x1F) << 3;
                                        dst++;
                                        s+=2;
                                }  
                                s += stride_diff;
                        }
                        else
                        {
                                dst += src_width*4;
                        }
                }  
        }
}

static void hwcReadRegion1555(hwcBoardInfo *bInfo, FxU32 src, FxU32 src_x, FxU32 src_y, FxU32 src_width, FxU32 src_height, FxU3
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c

        for(y = 0; y < end_y; y++) {    
                
                if((y & renderMask) == compareMask) {
                        /* This chip owns this scanline. */
                        for(x = 0; x < end_x; x++) {
                                *dst++ += (FxU16) (((*(FxU16*) s) >> 00) & 0x1F) << 3;
                                *dst++ += (FxU16) (((*(FxU16*) s) >> 05) & 0x1F) << 3;
                                *dst++ += (FxU16) (((*(FxU16*) s) >> 10) & 0x1F) << 3;
                                dst++;
                                s+=2;
                        }  
                        s += stride_diff;
                }
                else
                {
                        dst += src_width*4;
                }
        }  
}

****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c

        if (bInfo->CPUInfo.os_support & _CPU_FEATURE_MMX)
        {
                /* MMX Optimized Loop */
                __asm {
                        /* mm7 = zero */
                        pXor            mm7,    mm7;            

                        /* mm6 = mask */
                        push            0x00007C00;             /* a r */
                        push            0x03E0001F;             /* g b */
                        MovQ            mm6,    [esp]
                        Add                     esp,    8

                        /* mm5 = multiplier*/
                        push            0x00000001;             /* a<<=0 r<<=0 */
                        push            0x00200400;             /* g<<=5 b<<=10 */
                        MovQ            mm5,    [esp]
                        Add                     esp,    8

                        /* mm4 = multiplier2*/
                        push            0x00001080;             /* a=0000000000 r=1000010000 */
                        push            0x10801080;             /* g=1000010000 b=1000010000 */
                        MovQ            mm4,    [esp]
                        Add                     esp,    8
                }

                for(y = 0; y < end_y; y++)
                {    
                        if((y & renderMask) == compareMask)
                        {
                                /* This chip owns this scanline. */
                                __asm {

                                        /* Scanline Setup */
                                        Mov                     eax,    s
                                        Mov                     edx,    dst
                                        Mov                     edi,    end_x
                                        Shl                     edi,    3
                                        Add                     edi,    edx
                                        Xor                     ebx,    ebx

                                        align 8
loop_begin:
                                        /* Read pixel, and increase to 64 bits */
                                        mov                     bx,             word ptr [eax]  /* ebx has packed rgb */
#if 0
                                        mov                     ecx,    ebx                             /* ecx too */
                                        Shl                     ebx,    3                               /* bl now has b */
                                        Shl                     bh,     3                               /* bh now has g */
                                        Shl                     ecx,    9                               /* shift so r sig bit i
s bit 23 */
                                        And                     ecx,    0xF80000                /* ecx now has r */
                                        Mov                     cx,             bx                              /* ecx now has 
r,g,b */
                                        MovD            mm0,    ecx                             /* Copy RGB into mm0 */
                                        pUnpckLBW       mm0,    mm7                             /* Bytes -> Words */
                                        pSLLQ           mm0,    4                               /* Shift everything left 4 bits
 */
                                        pMulHW          mm0,    mm4                             /* 0000 1080 1080 1080 - Replic
ate high bits to missing low bits */
#else
                                        MovD            mm0,    ebx                             /* Copy RGB into mm0 */
                                        pUnpckLWD       mm0,    mm0                             /* Rep Low Words -> High Words 
*/
                                        pUnpckLDQ       mm0,    mm0                             /* Rep Low Dword -> High Dword 
*/
                                        pAnd            mm0,    mm6                             /* 0000 7C00 03E0 001F - Mask c
ols */
                                        pMulLW          mm0,    mm5                             /* 0000 0001 0020 0400 - Shifts
 all cols left */
                                        pSRLQ           mm0,    4                               /* Shift everything back right,
 but only 4 */
                                        pMulHW          mm0,    mm4                             /* 0000 1080 1080 1080 - Replic
ate high bits to missing low bits */
#endif

                                        /* Accumulate */
                                        MovQ            mm3,    mmword ptr [edx]
                                        pAddUSW         mm3,    mm0
                                        MovQ            [edx],  mm3
                                        Add                     eax,    2
                                        Add                     edx,    8

                                        /* Loop */
                                        cmp                     edi,    edx
                                        jne                     loop_begin

                                        /* Next scanline */
                                        add                     eax,    stride_diff
                                        mov                     s,              eax
                                        mov                     dst,    edx
                                };
                        }
                        else
                        {
                                dst += src_width*4;
                        }
                }  

******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c

//#pragma optimize("g", off)
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c

                /* Reset MMX State */
                __asm emms;
        }
        else
        {
                /* Standard Unoptimized Loop */
                for(y = 0; y < end_y; y++)
                {    
                        if((y & renderMask) == compareMask)
                        {
                                /* This chip owns this scanline. */
                                for(x = 0; x < end_x; x++) {
                                        *dst++ += (FxU16) (((*(FxU16*) s) >> 00) & 0x1F) << 3;
                                        *dst++ += (FxU16) (((*(FxU16*) s) >> 05) & 0x1F) << 3;
                                        *dst++ += (FxU16) (((*(FxU16*) s) >> 10) & 0x1F) << 3;
                                        dst++;
                                        s+=2;
                                }  
                                s += stride_diff;
                        }
                        else
                        {
                                dst += src_width*4;
                        }
                }  
        }
}

//#pragma optimize("g", off)
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
        stride_diff = strideInBytes - (src_width*4);

        for(y = 0; y < end_y; y++) {    
                
                if((y & renderMask) == compareMask) {
                        /* This chip owns this scanline. */
                        for(x = 0; x < end_x; x++) {
                                *dst++ += (FxU16) ((*(FxU32*) s) >> 0) & 0xFF;
                                *dst++ += (FxU16) ((*(FxU32*) s) >> 8) & 0xFF;
                                *dst++ += (FxU16) ((*(FxU32*) s) >> 16) & 0xFF;
                                *dst++ += (FxU16) ((*(FxU32*) s) >> 24) & 0xFF;
                                s+=4;
                        }  
                        s += stride_diff;
                }
                else
                {
                        dst += src_width*4;
                }
        }  
}
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
        stride_diff = strideInBytes - (src_width*4);
        
        if (bInfo->CPUInfo.os_support & _CPU_FEATURE_MMX)
        {
                /* MMX Optimized Loop */
                __asm pXor mm7, mm7;

                for(y = 0; y < end_y; y++)
                {    
                        if((y & renderMask) == compareMask)
                        {
                                /* This chip owns this scanline. */
                                __asm {

                                        /* Scanline Setup */
                                        Mov                     eax,    s
                                        Mov                     edx,    dst
                                        Mov                     edi,    end_x
                                        Shl                     edi,    3
                                        Add                     edi,    edx

                                        align 8
loop_begin:
                                        /* Read pixel, and increase to 64 bits */
                                        MovD            mm0,    dword ptr [eax]
                                        pUnpckLBW       mm0,    mm7

                                        /* Accumulate */
                                        MovQ            mm3,    mmword ptr [edx]
                                        pAddUSW         mm3,    mm0
                                        MovQ            [edx],  mm3
                                        Add                     eax,    4
                                        Add                     edx,    8

                                        /* Loop */
                                        cmp                     edi,    edx
                                        jne                     loop_begin

                                        /* Next scanline */
                                        add                     eax,    stride_diff
                                        mov                     s,              eax
                                        mov                     dst,    edx
                                };
                        }
                        else
                        {
                                dst += src_width*4;
                        }
                }

                /* Reset MMX State */
                __asm emms;
        }
        else
        {
                /* Standard Unoptimized Loop */
                for(y = 0; y < end_y; y++)
                {    
                        if((y & renderMask) == compareMask) 
                        {
                                /* This chip owns this scanline. */
                                for(x = 0; x < end_x; x++)
                                {
                                        *dst++ += (FxU16) ((*(FxU32*) s) >> 0) & 0xFF;
                                        *dst++ += (FxU16) ((*(FxU32*) s) >> 8) & 0xFF;
                                        *dst++ += (FxU16) ((*(FxU32*) s) >> 16) & 0xFF;
                                        *dst++ += (FxU16) ((*(FxU32*) s) >> 24) & 0xFF;
                                        
                                        s+=4;
                                }  
                                s += stride_diff;
                        }
                        else
                        {
                                dst += src_width*4;
                        }
                }  
        }
}
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
*/

FxU32 hwcAAReadRegion16(hwcBoardInfo *bInfo, FxU32 colBufNum,
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
*/
FxU32 hwcAAReadRegion16(hwcBoardInfo *bInfo, FxU32 colBufNum,
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
/* Gamma table */
FxU32 gss_red[256], gss_green[256], gss_blue[256];
        
static void hwcCopyBuffer8888Flipped(FxU16 *source, int w, int h, FxU8 *dst, int aaShift)
{
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
/* Gamma table */
FxU32 gss_red[256], gss_green[256], gss_blue[256], gss_red_shifted[256];
        
static void hwcCopyBuffer8888Flipped(hwcBoardInfo *bInfo, FxU16 *source, int w, int h, FxU8 *dst, int aaShift)
{
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
        FxU8 *endline = dst+w*4;

        while (dst<end)
        {
                while (dst<endline)
                {
                        *dst++ = (FxU8) gss_blue[*src++];
                        *dst++ = (FxU8) gss_green[*src++];
                        *dst++ = (FxU8) gss_red[*src++];
                        *dst++ = (FxU8) *src++;
                }
                src -= w*8;
                endline += w*4;
        }       
}
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
        FxU8 *endline = dst+w*4;
        w*= 4;

        if (bInfo->CPUInfo.os_support & _CPU_FEATURE_MMX)
        {
                /* MMX Optimized Loop */
                __asm
                {
                        Mov                     eax,    src             /* eax = source */
                        Mov                     edx,    dst             /* edx = dest */
                        Mov                     edi,    endline /* edi = endline */

                        align 8
loop_begin:
                        /* Read Pixel, Reduce to 32 bits */
                        MovQ            mm0,    mmword ptr [eax]
                        PackUSWB        mm0,    mm0
                        MovD            ebx,    mm0

                        /* Gamma Correct Blue */
                        Mov                     ecx,    ebx
                        And                     ecx,    0xFF
                        mov                     bl,             byte ptr [ecx*4 + gss_blue]

                        /* Gamma Correct Green */
                        Mov                     ecx,    ebx
                        Shr                     ecx,    8
                        And                     ecx,    0xFF
                        mov                     bh,             byte ptr [ecx*4 + gss_green]

                        /* Gamma Correct Red */
                        Mov                     ecx,    ebx
                        Shr                     ecx,    16
                        And                     ecx,    0xFF
                        mov                     ecx,    dword ptr [ecx*4 + gss_red_shifted]
                        And                     ebx,    0xFF00FFFF
                        Or                      ebx,    ecx

                        /* Write */
                        Mov                     [edx],  ebx

                        /* Next Pixel */
                        Add                     eax, 8  
                        Add                     edx, 4
                        cmp                     edx, edi                /* if (dst!=endline) */
                        jne                     loop_begin              /* goto loop_begin; */

                        /* Next Scanline */
                        Mov                     ebx, w
                        Add                     edi, ebx                /* endline += w; */
                        Shl                     ebx, 2
                        Sub                     eax, ebx                /* src -= w*2; */
                        cmp                     edx, end                /* if (dst!=end) */
                        jne                     loop_begin              /* goto loop_begin; */
                        
                        /* Reset MMX State */
                        emms;
                }
        }
        else
        {
                while (dst<end)
                {
                        while (dst<endline)
                        {
                                *dst++ = (FxU8) gss_blue[*src++];
                                *dst++ = (FxU8) gss_green[*src++];
                                *dst++ = (FxU8) gss_red[*src++];
                                *dst++ = (FxU8) *src++;
                        }
                        src -= w*2;
                        endline += w;
                }       
        }
}
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c

static void hwcCopyBuffer8888FlippedShifted(FxU16 *source, int w, int h, FxU8 *dst, int aaShift)
{
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c

static void hwcCopyBuffer8888FlippedShifted(hwcBoardInfo *bInfo, FxU16 *source, int w, int h, FxU8 *dst, int aaShift)
{
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
        FxU8 *endline = dst+w*4;

        while (dst<end)
        {
                while (dst<endline)
                {
                        *dst++ = (FxU8)gss_blue[(*src++) >> aaShift];
                        *dst++ = (FxU8)gss_green[(*src++) >> aaShift];
                        *dst++ = (FxU8)gss_red[(*src++) >> aaShift];
                        *dst++ = (FxU8)((*src++) >> aaShift);
                }
                src -= w*8;
                endline += w*4;
        }       
}
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
        FxU8 *endline = dst+w*4;
        w *= 4;

        if (bInfo->CPUInfo.os_support & _CPU_FEATURE_MMX)
        {
                /* MMX Optimized Loop */
                __asm
                {
                        Mov                     eax,    src             /* eax = source */
                        Mov                     edx,    dst             /* edx = dest */
                        Mov                     edi,    endline /* edi = endline */
                        MovD            mm6,    aaShift /* mm6 = aaShift */

                        align 8
loop_begin:
                        /* Read Pixel, Reduce to 32 bits */
                        MovQ            mm0,    mmword ptr [eax]
                        pSRLW           mm0,    mm6
                        PackUSWB        mm0,    mm0
                        MovD            ebx,    mm0

                        /* Gamma Correct Blue */
                        Mov                     ecx,    ebx
                        And                     ecx,    0xFF
                        mov                     bl,             byte ptr [ecx*4 + gss_blue]

                        /* Gamma Correct Green */
                        Mov                     ecx,    ebx
                        Shr                     ecx,    8
                        And                     ecx,    0xFF
                        mov                     bh,             byte ptr [ecx*4 + gss_green]

                        /* Gamma Correct Red */
                        Mov                     ecx,    ebx
                        Shr                     ecx,    16
                        And                     ecx,    0xFF
                        mov                     ecx,    dword ptr [ecx*4 + gss_red_shifted]
                        And                     ebx,    0xFF00FFFF
                        Or                      ebx,    ecx

                        /* Write */
                        Mov                     [edx],  ebx

                        /* Next Pixel */
                        Add                     eax, 8  
                        Add                     edx, 4
                        cmp                     edx, edi                /* if (dst!=endline) */
                        jne                     loop_begin              /* goto loop_begin; */

                        /* Next Scanline */
                        Mov                     ebx, w
                        Add                     edi, ebx                /* endline += w; */
                        Shl                     ebx, 2
                        Sub                     eax, ebx                /* src -= w*2; */
                        cmp                     edx, end                /* if (dst!=end) */
                        jne                     loop_begin              /* goto loop_begin; */
                        
                        /* Reset MMX State */
                        emms;
                }
        }
        else
        {
                while (dst<end)
                {
                        while (dst<endline)
                        {
                                *dst++ = (FxU8)gss_blue[(*src++) >> aaShift];
                                *dst++ = (FxU8)gss_green[(*src++) >> aaShift];
                                *dst++ = (FxU8)gss_red[(*src++) >> aaShift];
                                *dst++ = (FxU8)((*src++) >> aaShift);
                        }
                        src -= w*2;
                        endline += w;
                }       
        }
}
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c

static void hwcCopyBuffer8888FlippedDithered(FxU16 *source, int w, int h, FxU8 *dst, int aaShift)
{
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c

static void hwcCopyBuffer8888FlippedDithered(hwcBoardInfo *bInfo, FxU16 *source, int w, int h, FxU8 *dst, int aaShift)
{
******

****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c
        FxU8 *endline = dst+w*4;
        FxU32 dither_mask, val_max, c;
        FxU32 er = 0;
        FxU32 eg = 0;
        FxU32 eb = 0;
        FxU32 ea = 0;

****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c
        FxU8 *endline = dst+w*4;
        FxI32 dither_mask, val_max, c;
        FxI32 er = 0;
        FxI32 eg = 0;
        FxI32 eb = 0;
        FxI32 ea = 0;

        w *= 4;

******

Resync failed.  Files are too different
****** glidexp_build1014_src\glide3x\h5\minihwc\Minihwc.c

        while (dst<end)
        {
                while (dst<endline)
                {
                        c = *src++ + er;
                        c = min(c,val_max);
                        er = c & dither_mask;
                        *dst++ = (FxU8)gss_blue[c >> aaShift];

                        c = *src++ + eg;
                        c = min(c,val_max);
                        eg = c & dither_mask;
                        *dst++ = (FxU8)gss_green[c >> aaShift];

                        c = *src++ + eb;
                        c = min(c,val_max);
                        eb = c & dither_mask;
                        *dst++ = (FxU8)gss_red[c >> aaShift];

                        c = *src++ + ea;
                        c = min(c,val_max);
                        ea = c & dither_mask;
                        *dst++ = (FxU8)(c >> aaShift);
                }
                src -= w*8;
                endline += w*4;
        }       
}

/* Amazingly nasty code follows. */
void hwcAAScreenShot(hwcBoardInfo *bInfo, FxU32 colBufNum, FxBool dither)
{
        FxU32 aaShift = 0;
        FxU8  header[18];
        FILE  *file;

#ifdef _WIN32
    SYSTEMTIME curtime;
#else
        static FxU32 fileNameNum;
#endif
        char fileName[256];
        
        FxU16 *buffer;
        FxU8 *out;
        
        /* Allocate buffer to store frame into... */
        
        buffer = malloc(bInfo->vidInfo.xRes * bInfo->vidInfo.yRes * 8);
        
        if(!buffer) return;
        
        out = malloc(bInfo->vidInfo.xRes * bInfo->vidInfo.yRes * 4);
        
        if(!out) {
                free(buffer);
                return;
        }

        aaShift = hwcAAReadRegion16(bInfo, colBufNum, 0, 0, bInfo->vidInfo.xRes, bInfo->vidInfo.yRes, buffer);

        /* Gamma correct image based on DAC contents. */
        /*hwcGetGammaTable(bInfo, 256, gss_red, gss_green, gss_blue);*/
        
        if (aaShift)
        {
                if (dither)
                        hwcCopyBuffer8888FlippedDithered(buffer, bInfo->vidInfo.xRes, bInfo->vidInfo.yRes, out, aaShift);
                else
                        hwcCopyBuffer8888FlippedShifted(buffer, bInfo->vidInfo.xRes, bInfo->vidInfo.yRes, out, aaShift);
        }
        else
        {
                hwcCopyBuffer8888Flipped(buffer, bInfo->vidInfo.xRes, bInfo->vidInfo.yRes, out, 0);
        }
        
        /* Write buffer to disk */
#ifdef _WIN32
        GetLocalTime(&curtime);
        sprintf(fileName,"glide_%04d%02d%02d_%02d%02d%02d.tga",curtime.wYear, curtime.wMonth, curtime.wDay, curtime.wHour, curt
ime.wMinute, curtime.wSecond);
#else
        sprintf(fileName,"glide%04ld.tga",fileNameNum++);
#endif
        memset (header, 0, 18);
        header[2] = 2;    /* Uncompressed targa */
        header[12] = (FxU8)(bInfo->vidInfo.xRes & 255);
        header[13] = (FxU8)(bInfo->vidInfo.xRes >> 8);
        header[14] = (FxU8)(bInfo->vidInfo.yRes & 255);
        header[15] = (FxU8)(bInfo->vidInfo.yRes >> 8);
        header[16] =    32;  /* bytes per pixel */
        
        if(file = fopen(fileName,"wb")) {
                fwrite(header,18,1,file);
                fwrite(out,bInfo->vidInfo.xRes * bInfo->vidInfo.yRes * 4, 1, file);
                fclose(file);
        }
        
        /* Free memory */
****** glidexp_build1015_src\glide3x\h5\minihwc\Minihwc.c

        if (bInfo->CPUInfo.os_support & _CPU_FEATURE_MMX)
        {
                FxU32 sse_mmxplus = bInfo->CPUInfo.os_support & (_CPU_FEATURE_MMXPLUS|_CPU_FEATURE_SSE);

                /* MMX Optimized Loop */
                __asm
                {
                        /* mm7 = all ones */
                        Mov                     eax,    0xFFFFFFFF
                        MovD            mm7,    eax
                        pUnpckLDQ       mm7,    mm7                             /* Rep Low Dword -> High Dword */

                        /* mm6 = aaShift */
                        MovD            mm6,    aaShift 

                        /* mm5 = accumulated error */
                        pXor            mm5,    mm5             

                        /* mm4 = error_mask */
                        MovD            mm4,    dither_mask             /* error_mask -> Low word */
                        pUnpckLWD       mm4,    mm4                             /* Rep Low Words -> High Words */
                        pUnpckLDQ       mm4,    mm4                             /* Rep Low Dword -> High Dword */

                        /* mm3 = val_max */
                        MovD            mm3,    val_max                 /* val_max -> Low word */
                        pUnpckLWD       mm3,    mm3                             /* Rep Low Words -> High Words */
                        pUnpckLDQ       mm3,    mm3                             /* Rep Low Dword -> High Dword */

                        /* mm2 = min mask */

                        /* mm1 = masked maximum cols */

                        /* mm0 = colour */

                        /* eax = source */
                        Mov                     eax,    src             

                        /* edx = dest */
                        Mov                     edx,    dst             

                        /* edi = endline */
                        Mov                     edi,    endline 

                        /* Check to see if we support MMXPlus or SSE */
                        Mov                     ecx,    sse_mmxplus
                        And                     ecx,    ecx
                        jz                      mmx_loop_begin

                        /* SSE/MMX+ Loop */
                        align 8
loop_begin:
                        /* Read Pixel and add error  */
                        /* c = *src + er - (*src>>8) */
                        MovQ            mm0,    mmword ptr [eax]
                        MovQ            mm1,    mm0
                        pSRLW           mm1,    8
                        pSubSW          mm0,    mm1
                        pAddSW          mm0,    mm5

                        /* Clamp to max */
                        /* c = min(c,val_max) */
                        pMinSW          mm0,    mm3

                        /* Find error */
                        /* er = c & dither_mask; */
                        MovQ            mm5,    mm0                     /* er = c */
                        pAnd            mm5,    mm4                     /* er &= dither_mask */

                        /* Reduce to 32 bits */
                        pSRLW           mm0,    mm6
                        PackUSWB        mm0,    mm0
                        MovD            ebx,    mm0

                        /* Gamma Correct Blue */
                        Mov                     ecx,    ebx
                        And                     ecx,    0xFF
                        mov                     bl,             byte ptr [ecx*4 + gss_blue]

                        /* Gamma Correct Green */
                        Mov                     ecx,    ebx
                        Shr                     ecx,    8
                        And                     ecx,    0xFF
                        mov                     bh,             byte ptr [ecx*4 + gss_green]

                        /* Gamma Correct Red */
                        Mov                     ecx,    ebx
                        Shr                     ecx,    16
                        And                     ecx,    0xFF
                        mov                     ecx,    dword ptr [ecx*4 + gss_red_shifted]
                        And                     ebx,    0xFF00FFFF
                        Or                      ebx,    ecx

                        /* Write */
                        Mov                     [edx],  ebx

                        /* Next Pixel */
                        Add                     eax, 8  
                        Add                     edx, 4
                        cmp                     edx, edi                /* if (dst!=endline) */
******


Comparing files glidexp_build1014_src\glide3x\h5\minihwc\win_regpath.c and glidexp_build1015_src\glide3x\h5\minihwc\win_regpath.c
FC: no differences encountered

Comparing files glidexp_build1014_src\glide3x\h5\minihwc\nt6ksli_mode.c and glidexp_build1015_src\glide3x\h5\minihwc\nt6ksli_mode.c
FC: no differences encountered

Comparing files glidexp_build1014_src\glide3x\h5\minihwc\Win_mode.c and glidexp_build1015_src\glide3x\h5\minihwc\Win_mode.c
FC: no differences encountered

